#							-*- autoconf -*-

AT_BANNER([Autoconf base layer.])


## ------------------------------- ##
## AC_REQUIRE: topological sort..  ##
## ------------------------------- ##

# Check that dependencies are always properly honored.

AT_SETUP([AC_REQUIRE: topological sort])

AT_DATA(configure.ac,
[[define([REQUIRE_AND_CHECK],
[AC_REQUIRE([$1])dnl
test -z "$m4_translit([$1], [A-Z], [a-z])" && AS_EXIT(1)])

AC_DEFUN([TEST1],
[REQUIRE_AND_CHECK([TEST2a])
REQUIRE_AND_CHECK([TEST2b])
test1=set])

AC_DEFUN([TEST2a],
[test2a=set])

AC_DEFUN([TEST2b],
[REQUIRE_AND_CHECK([TEST3])
test2b=set])

AC_DEFUN([TEST3],
[REQUIRE_AND_CHECK([TEST2a])
test3=set])

AC_PLAIN_SCRIPT()dnl
#! /bin/sh

TEST1
test -z "$test1" &&
  AC_MSG_ERROR([\$test1 is empty])
AS_EXIT(0)
]])

AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE

AT_CLEANUP



## ----------------------------------------------- ##
## AC_REQUIRE and AC_DEFUN_ONCE: Require, expand.  ##
## ----------------------------------------------- ##

AT_SETUP([AC_REQUIRE & AC_DEFUN_ONCE: Require, expand])

AT_DATA([configure.ac],
[[AC_DEFUN([TEST],
[AC_REQUIRE([MULTI_TEST])
AC_REQUIRE([SINGLE_TEST])])

AC_DEFUN([MULTI_TEST],
[multi_test=".$multi_test"])

AC_DEFUN_ONCE([SINGLE_TEST],
[single_test=".$single_test"])

AC_PLAIN_SCRIPT()dnl
#! /bin/sh

TEST
TEST
MULTI_TEST
MULTI_TEST
SINGLE_TEST
SINGLE_TEST

case $multi_test:$single_test in
  ...:. ) AS_EXIT(0);;
  ...:* ) AC_MSG_ERROR([DEFUN_ONCE is broken]);;
  *:.   ) AC_MSG_ERROR([DEFUN is broken (Wow, congrats!)]);;
esac
]])

AT_CHECK_AUTOCONF([], 0, [],
[configure.ac:18: warning: SINGLE_TEST invoked multiple times
configure.ac:19: warning: SINGLE_TEST invoked multiple times
])

AT_CHECK_CONFIGURE

AT_CLEANUP



## ----------------------------------------------- ##
## AC_REQUIRE and AC_DEFUN_ONCE: Expand, require.  ##
## ----------------------------------------------- ##

AT_SETUP([AC_REQUIRE & AC_DEFUN_ONCE: Expand, require])

AT_DATA([configure.ac],
[[AC_DEFUN([TEST],
[AC_REQUIRE([MULTI_TEST])
AC_REQUIRE([SINGLE_TEST])])

AC_DEFUN([MULTI_TEST],
[multi_test=".$multi_test"])

AC_DEFUN_ONCE([SINGLE_TEST],
[single_test=".$single_test"])

AC_PLAIN_SCRIPT()dnl
#! /bin/sh

MULTI_TEST
MULTI_TEST
SINGLE_TEST
SINGLE_TEST
TEST
TEST

case $multi_test:$single_test in
  ..:. ) AS_EXIT(0);;
  ..:* ) AC_MSG_ERROR([DEFUN_ONCE is broken]);;
  *:.  ) AC_MSG_ERROR([DEFUN is broken (Wow, congrats!)]);;
     * ) AC_MSG_ERROR([received `$multi_test:$single_test']);;
esac
]])

AT_CHECK_AUTOCONF([], 0, [],
[configure.ac:17: warning: SINGLE_TEST invoked multiple times
])
AT_CHECK_CONFIGURE

AT_CLEANUP



## ------------------------- ##
## AC_REQUIRE & AC_PROVIDE.  ##
## ------------------------- ##

AT_SETUP([AC_REQUIRE & AC_PROVIDE])

AT_DATA([configure.ac],
[[AC_DEFUN([TEST],
[AC_REQUIRE([INNER_TEST])])

AC_DEFUN([INNER_TEST],
[inner_test=".$inner_test"])

AC_PLAIN_SCRIPT()dnl
#! /bin/sh

AC_PROVIDE([INNER_TEST])
TEST

case $inner_test in
  "" ) AS_EXIT(0);;
  *  ) AC_MSG_ERROR([received `$inner_test']);;
esac
]])

AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE

AT_CLEANUP


## ---------------------- ##
## AC_REQUIRE & AC_LANG.  ##
## ---------------------- ##

AT_SETUP([AC_REQUIRE & AC_LANG])

AT_DATA([configure.ac],
[[AC_DEFUN([AC_F77_1],
[AC_LANG_PUSH([Fortran 77])
if test $ac_ext != f; then
  AC_MSG_ERROR([F77_1: current shell language is $ac_ext, expected Fortran])
fi
AC_LANG_POP
])


AC_DEFUN([AC_F77_2],
[AC_LANG_PUSH([Fortran 77])
AC_REQUIRE([AC_F77_1])
if test $ac_ext != f; then
  AC_MSG_ERROR([F77_2: current shell language is $ac_ext, expected Fortran])
fi
AC_LANG_POP
])

AC_INIT
AC_F77_2
AS_EXIT(0)
]])

AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE

AT_CLEANUP


## ---------------- ##
## AC_CACHE_CHECK.  ##
## ---------------- ##

# Make sure AC_CACHE_CHECK is silent with -q.

AT_SETUP([AC_CACHE_CHECK])

AT_DATA([configure.ac],
[[AC_INIT
AC_CACHE_CHECK([for nothing],
               [ac_nothing],
               [ac_nothing=found])
]])

AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([-q])

AT_CLEANUP


## ---------- ##
## AC_TRY_*.  ##
## ---------- ##

AT_SETUP([AC_TRY_*])

AT_DATA([configure.ac],
[[AC_INIT

if AC_TRY_COMMAND([(echo "The Cat in the Hat";
                    echo "The Hat in the Cat" >&2)
                  | grep \^The\ Cat\ in\ the\ Hat\$ >/dev/null]); then
  :
else
  AC_MSG_ERROR([Didn't see the Cat in the Hat!])
fi

if AC_TRY_COMMAND([(echo "The Cat in the Hat";
                    echo "The Hat in the Cat" >&2)
                  | grep \^The\ Hat\ in\ the\ Cat\$ >/dev/null]); then
  AC_MSG_ERROR([Saw the Hat in the Cat!])
fi
]])

AT_CHECK_AUTOCONF
AT_CHECK_CONFIGURE([-q])

AT_CLEANUP
